perm filename EXCON.MAC[GPR,LCS] blob sn#138796 filedate 1975-01-07 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00015 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00003 00002		TITLE	EXCON
C00005 00003		SUBTTL	DEFINITIONS	G. Ross Explorations, Inc.
C00009 00004		SUBTTL	DATA	G. Ross Explorations, Inc.
C00012 00005		SUBTTL	TTY INPUT AND VERIFICATION	G. Ross Explorations, Inc.
C00020 00006		SUBTTL	FILE EXPANSION	G. Ross Explorations, Inc.
C00028 00007	
C00029 00008		SUBTTL	FILE DELETION	G. Ross Explorations, Inc.
C00033 00009	
C00034 00010		SUBTTL	FILE LISTING	G. Ross Explorations, Inc.
C00038 00011	
C00039 00012		SUBTTL	FILE COMPACTING	G. Ross Explorations, Inc.
C00042 00013		SUBTTL	FILE ADDING	G. Ross Explorations, Inc.
C00045 00014		SUBTTL	SUBROUTINES	G. Ross Explorations, Inc.
C00078 00015		SUBTTL	HISEG DATA	G. Ross Explorations, Inc.
C00081 ENDMK
C⊗;
	TITLE	EXCON
	TWOSEG
	SUBTTL REMARKS  G. Ross Explorations, Inc.
;
;	THE SET UP IN THE EXCON FILE IS A HEADER BLOCK, THE FILE, 
;	AND TRAILER BLOCK
;
;	THE HEADER BLOCK IS PRECEEDED BY "101010,,101010", FOLLOWS
;	WITH THE NAME OF THE FILE IN SIXBIT, THE NEXT WORD SIXBIT EXT,,0
;	AND THE LAST, RANDOM NUMBER,,DATE:
;
;	010101010101
;	SIXBIT/FILE/
;	SIXBIT/EXT/
;	RNDNUM,,DATE
;
;	THE TRAILER IS MADE UP OF THE NUMBER 010101,,010101,
;	SIXBIT/FILE/, SIXBIT/EXT/,,SAME RANDOM NUMBER AS IN HEADER:
;
;	010101010101
;	SIXBIT/FILE/
;	SIXBIT/EXT/,,RNDNUM
;
;	EXCON IS COMPATIBLE WITH THE OLD EXCON OFF OF THE DECUS TAPES
;	HELP FILE IS SYS:EXCON.HLP
	SUBTTL	DEFINITIONS	G. Ross Explorations, Inc.
;
;	ACS:
;
	P==17				;PUSH DOWN AC
	F==16				;FLAG AC, FUNC FLAGS IN LEFT, OTHERS IN RIGHT
	FILE.==12			;CONTAINS SIXBIT/FILE/ OF CURRENT FILE
	EXT.==13				;CONTAINS SIXBIT/EXT/
	DEV.==14				;CINTAINS SIXBIT/DEV/
	PPN.==15				;CONTAINS P,PN
	PNT==11				;POINTER
	CHRCNT==10
	DATE.==10
	CNT==10
	FILE2.==6			;NEW FILE NAME FROM LEFT FILE LIST
	EXT2.==7				;NEW EXT
	XFER==5				;CONTAINS TRANSFER ADR ON EOF
;
;	FLAGS:	LEFT HALF:
;
	A==1				;ADDING
	C==2				;COMPACTING
	D==4				;DELETING
	E==10				;EXPANDING
	L==20				;LISTING
;
;		RIGHT HALF:
;
	XSEEN==1				;A /X WAS SEEN
	ANYCHR==2			;IF ON, CMDCHR PASSES ANY KIND OF CHARACTER
	ARWSEN==4			;A BACK ARROW WAS SEEN
	FILSEN==10			;A FILE WAS SEEN ON INPUT
	FILST==20			;WE HAVE TWO FILE LISTS
	TYPPPN==40			;DETERMINES IF TO TYPE THE PPN OF THE FILE
	FILSPC==100			;IF FILES WERE SPECIFIED
	TTYOUT==200			;DOING TTY OUTPUT NOT DSK
	CHRTYP==400			;SOMETHING WAS TYPED ON INPUT LINE
	DSKUFD==1000			;WERE WORKING ON A DSK UFD
	DTAUFD==2000			;WERE WORKING ON A DTA DIRECTORY
	UFDERR==4000			;ERROR READING THE UFD
	SKPFLG==10000			;WE ARE IN SKPFIL
	FILINC==20000			;IF 0, DON'T INCREMENT FILE PNT
	RENMES==40000			;SKIP MES "UNABLE TO FORM .BAK..."(RENERR)
;
	IFNDEF	DIRFIL,<DIRFIL==↑D200>	;NUMBER OF FILES FOR IN CORE DIRECTORY
	IFNDEF	TTYFIL,<TTYFIL==↑D50>	;NUMBER OF FILES ACCEPTED FROM TTY
	IFNDEF	PDLEN,<PDLEN==↑D15>	;LENGTH OF PUSH DOWN LIST
	IFNDEF	CCLEN,<CCLEN==↑D32>	;LENGTH OF TMPCOR BLOCK
;
	VWHO==3				;WHO MADE EXCON
	VMAJOR==3			;MAJOR VERSION NUMBER
	VMINOR==0			;MINOR VERSION NUMBER
	VEDIT==27			;EDIT NUMBER
;
	LOC	124			;REENTERY POINT
	EXP	RENTER

	LOC	137			;VERSION
	BYTE (3) VWHO (9) VMAJOR (6) VMINOR (18) VEDIT
	RELOC
;
;	DEVCHR DEFINITIONS:
;
	DV.DSK==200000			;DEVICE IS A DSK
	DV.CDR==100000			;DEVICE IS A CDR
	DV.LPT==40000			;DEVICE IS A LPT
	DV.PTP==400			;A PTP
	DV.PTR==200			;A PTR
	DV.DTA==100			;A DTA
	DV.MTA==20			;A MTA
	DV.TTY==10			;A TTY
	DV.AVL==40			;DEVICE IS AVAILABLE FOR OUR USE
;
;	FILE STATUS DEFINITIONS:
;
	IO.IMP==400000			;IMPROPER MODE, SOFTWARE WRITE LOCK
	IO.DER==200000			;DATA MISSED
	IO.DTE==100000			;PARITY ERROR
	IO.BKT==40000			;BLOCK TOO LARGE
;
	MARK==100000			;MARKS A FILE IN DIRECT FOR USE
;
;	MACRO TO GENERATE THE ASCII OF THE MONTHS AND "-" THERE TO
;
	DEFINE	MONGEN(A)<
	IRP	A,<
	BYTE	(21) "A" (7) "-"
>>
	SUBTTL	DATA	G. Ross Explorations, Inc.
FILES:	BLOCK	<TTYFIL*5>+1		;WHERE INPUT FILE NAMES ARE STORED:
					;SIXBIT/FILE/
					;XWD "EXT",EXT QUESTION MASK
					;SIXBIT/DEVICE/
					;XWD P,PN
					;FILE QUESTION MARK MASK
DIRECT:	BLOCK	<DIRFIL*4>+1		;CONTAINS IN CORE DIRECTORY OF EXCON FILE:
					;SIXBIT/FILE/
					;XWD "EXT",DATE
					;SIXBIT/DEVICE/
					;XWD P,PN
PDL:	BLOCK	PDLEN			;PUSH DOWN STACK
FILPTR:	Z				;FILE POINTER INTO FILES WHEN LOADING IT
CURDEV:	Z				;CURRENT DEVICE NAME
ARROW:	Z				;POINTS TO FILE AFTER BACK ARROW IN FILES
JOBPPN:	Z				;USERS PPN
FILEND:	Z				;POINTS JUST BEYOND END OF FILES
CCL:	Z				;TO REMEMBER THE CCL ENTRY
CCLPNT:	Z				;POINTER TO THE TMPCOR BUFFER
SYSBLK:	17				;OPEN BLOCK FOR HELP FILE
	SIXBIT/SYS/			;DUMP MODE
	Z
SYSHLP:	SIXBIT/EXCON2/			;HELP FILE NAME
	SIXBIT/HLP/
	Z
	Z
HLPWRD:	IOWD	200,DTANAM		;IO WORD TO LOAD BLOCK OF HELP TEXT
	Z
OPBLKI:	10				;STANDARD INPUT OPEN BLOCK
	Z				;DEVICE NAME
	XWD	0,IBUF			;BUFFER HEADER
OPBLKO:	10				;STANDARD OUTPUT OPEN BLOCK
	Z				;DEVICE NAME
	XWD	OBUF,0			;BUFFER HEADER
OPZ:	17				;DUMP MODE
	Z				;DEVICE NAME
	Z				;NO BUFFERS
OPBLKR:	BLOCK	3			;RENAME OPEN BLOCK
OBUF:	BLOCK	3			;OUTPUT BUFFER HEADER
IBUF:	BLOCK	3			;INPUT BUFFER HEADER
ZEROS:	BLOCK	4			;DELETE BLOCK
XDEV:	Z				;DEVICE NAME FOR /X
XPPN:	Z				;PPN FOR /X
OPUFD:	BLOCK	3			;OPEN BLOCK FOR UFD
UFDBUF:	BLOCK	3			;UFD BUFFER HEADER
DTAWRD:	IOWD	177,DTANAM		;IOWORD TO READ DTA DIRECTORY
	Z
DTANAM:	BLOCK	201			;PLACE FOR DTA DIRECTORY AND HELP TEXT
CCLBLK:	SIXBIT/XCN/			;NAME OF TMPCOR FILE
	IOWD	CCLEN,CCLBUF		;POINTER FOR THE MONITOR
	Z				;AND ZERO FOR DSK:JBNXCN.TMP IF NECESSARY
CCLBUF:	BLOCK	CCLEN+1			;ROOM TO READ IN TMPCOR
	SUBTTL	TTY INPUT AND VERIFICATION	G. Ross Explorations, Inc.
	RELOC	400000
START:	TDZA				;REMEMBER NORMAL ENTRY POINT INTO EXCON
	SETO				;SET FOR CCL ENTRY
	MOVEM	CCL			;SAVE IT FOR USE
	GETPPN				;GET THE PPN OF THIS JOB
	JFCL				;DON'T CARE ABOUT OTHER JOBS
	MOVEM	JOBPPN			;SAVE IT
RENTER:	RESET				;REENTRY POINT; RESET
	SETZB	F,ARROW			;NO FLAGS, NO BACK ARROW SEEN
	SETZB	CHRCNT,FILPTR		;NO CHRCNT,FILPTR POINTS TO  BEGIN OF FILES
	MOVSI	'DSK'			;DEFAULT OF DSK:
	MOVEM	CURDEV			;TELL THE WORLD
	MOVEM	XDEV			;DEFAULT FOR /X TOO
	MOVE	JOBPPN			;GET USERS PPN
	MOVEM	XPPN			;DEFAULT FOR /X ALSO
	MOVE	P,[IOWD PDLEN,PDL]	;SETUP PUSH DOWN LIST
	SKIPE	CCL			;WAS IT A CCL ENTRY?
	PUSHJ	P,SETCCL		;YES, SET UP THE TMPCOR BUFFER
	SKIPN	CCL			;NO STAR IF CCL ENTRY
	PUSHJ	P,TYPSTR		;TELL THE USER WE'RE READY
	MOVEI	CNT,TTYFIL-1		;WE WON'T GET MORE THAN <TTYFIL> FROM THE TTY
	PUSHJ	P,GETFIL		;GET A FILE
	SOJGE	CNT,.-1			;GO FOR MORE IF ROOM AND IS MORE COMING
	SKIPN	ARROW			;ARROW SEEN?
	JRST	NOARRW			;NO
	JUMPL	10,MNYFIL		;TOO MANY FILES?
	TLNN	F,E!A!C!L!D		;SWITCH SEEN?
	JRST	NOFUNC			;NO
	MOVE	ARROW			;OK CHECK FOR MANY THINGS
	CAMN	FILEND			;NULL RIGHT SIDE?
	JRST	NULR			;YES
	TLNE	F,E			;EXPANDING?
	JRST	XPNCHK			;GO THERE TO GET RIGHT ADR
	TLNN	F,L			;LISTING?
	JRST	.+3			;NO
	TRNE	F,XSEEN			;YES, OUTPUT DEVICE SETUP?
	JRST	LIST			;YES, GO LIST
	CAIN	FILES			;NULL LEFT SIDE?
	JRST	NULL			;YES
	CAIN	FILES+5			;FILE LIST ON LEFT SIDE?
	JRST	FILCHK			;NO, SKIP FILE LIST LENGTHS CHECK
	TLNE	F,D!L			;/D OR /L HAVE A FILE LIST ON THE LEFT SIDE?
	JRST	LSTSEN			;IT DOES! NO GOOD!
	MOVEI	1,FILES+5		;GET ADR OF BEGIN OF RIGHT LIST
LSTCHK:	TRO	F,FILST			;THERE IS A FILE LIST ON LEFT SIDE
	SUBM	1			;GET LENGTH OF LEFT FILE LIST
	MOVE	2,FILEND		;GET FILES END
	SUB	2,			;GET LENGTH OF RIGHT FILE LIST
	TLNE	F,E			;EXPANDING?
	SUBI	2,5			;RIGHT LIST OFF BY 5 GET RID OF IT
	CAME	2,1			;ARE THEY EQUAL?
	JRST	BADLST			;NO
FILCHK:	MOVEI	1,FILES			;GET THE EXCON FILE NAME
	TLNE	F,E			;ARE WE EXPANDING?
	MOVE	1,ARROW			;THEN GET THE RIGHT ADR
	PUSHJ	P,WLDCHK		;CHECK FOR WILD CARDING
	JRST	NOWILD			;WE DON'T WANT WILD CARDING IN EXCON FILE NAME
	HLLZ	1(1)			;GET THE EXT ONLY
	MOVEM	1(1)			;PUT IT BACK, ZEROING THE DATE
	TLNE	F,L			;LISTING?
	JRST	LIST			;GO DO IT
	MOVE	2,2(1)			;GET THE DEVICE OF THE EXCON FILE 
	DEVCHR	2,			;FIND OUT ABOUT THIS DEVICE
	JUMPE	2,NODEV			;NO SUCH DEVICE?
	TLNE	2,DV.CDR!DV.LPT!DV.PTP!DV.PTR!DV.MTA!DV.TTY	;A DECENT DEVICE?
	JRST	BADEV			;NO
	TLNN	2,DV.AVL		;IS THE DEVICE AVAILABLE?
	JRST	NOTAVL			;NO
	TLNE	F,C			;COMPACTING?
	JRST	COMPAC			;GO TO WORK
	PUSHJ	P,XCNCHK		;CHECK FOR XCN EXT
	JRST	RENTER			;CAN'T GET THAT FILE?
	MOVE	DEV.,OPBLKI+1		;MOVE THE DEVICE TO THE OPEN BLOCK
	TLNE	F,E			;ARE WE EXPANDING?
	JRST	EXPAND			;GO TO WORK
	TLNN	2,DV.DTA		;IS THE DEVICE A DTA?
	JRST	RENAM.			;NO, RENAME ORIGINAL FILE
	PUSHJ	P,DATAIN		;GET THE INPUT BUFFERS SETUP
	MOVSI	EXT.,'BAK'		;.BAK EXTENSION TO THE DSK
	SETZ	DEV.,			;STANDARD DEFAULTS
	MOVE	PPN.,JOBPPN		;USE THE USERS PPN
	MOVSI	'DSK'			;AND DEVICE DSK
	MOVEM	OPBLKO+1		;PUT IT UP FOR THE MONITOR
	OPEN	1,OPBLKO		;GET THE DSK FROM THE MONITOR
	JRST	NODSK			;WE TRIED....
	ENTER	1,FILE.			;TELL THE MONITOR ABOUT THIS .BAK FILE
	JRST	FILINR+1		;AGAIN, WE TRIED.....
	PUSHJ	P,OUTIT			;SET UP THE OUTPUT BUFFERS
	MOVEI	XFER,.+4		;WHERE TO GO ON AN EOF
	PUSHJ	P,GETWRD		;GET A WORD FROM THE DTA
	PUSHJ	P,PUTWRD		;PUT IT IN THE .BAK FILE
	JRST	.-2			;AND GO BACK FOR MORE
	RELEAS				;HERE ON EOF; RELEAS ALL FILES
	RELEAS	1,			;PARTICULARLY THE .BAK ONE
	TLNN	F,A			;ARE WE ADDING?
	JRST	DELETE			;NO, MUST BE DELETING...DO IT!
	JRST	ADD			;GO ADD
RENAM.:	MOVSI	EXT.,'BAK'		;HERE JUST TO DO A RENAME
	SETZM	DEV.			;DON'T WANT TO TOUCH THE DATE OR PRO
	RENAME	FILE.			;TRY IT
	JRST	.+3			;LET'S SEE ABOUT AN EXISTING FILE
	RELEAS				;GOOD
	JRST	RENAM.-5		;GO TO WORK
	HRRZ	EXT.			;GET THE ERROR CODE
	CAIE	4			;WAS THERE ALREADY A .BAK FILE THERE?
	JRST	RENERR			;NO, RENAME ERROR
	MOVE	OPBLKI+1		;YES, TRY TO DELETE IT.  GET THE DSK DEVICE
	MOVEM	OPBLKR+1		;PUT IT IN THE RENAME OPEN BLOCK
	OPEN	2,OPBLKR		;GET THAT DEVICE
	JRST	RENERR			;WE TRIED.....
	LOOKUP	2,FILE.			;LOOKUP THAT .BAK FILE
	JRST	.+4			;WE TRIED.....
	RENAME	2,ZEROS			;TRY TO DELETE IT
	JRST	RENER2			;WE TRIED.....
	RELEAS	2,			;GET RID OF THE CHANEL
	JRST	RENAM.+1		;GO TRY TO RENAME TO .BAK
XPNCHK:	CAIN	FILES			;HERE IF /E TO CHECK FOR FILE LISTS
	JRST	FILCHK			;NO FILE LIST, SKIP LENGTH CHECK
	MOVEI	1,FILES			;FILE LIST, GET PROPER ADR OF RIGHT LIST
	JRST	LSTCHK			;GO CHECK IT
	SUBTTL	FILE EXPANSION	G. Ross Explorations, Inc.
EXPAND:	RELEAS				;RELEAS THE INPUT BECAUSE XCNCHK DOESN'T
	MOVE	1,ARROW			;GET ADR OF EXCON FILE
	PUSHJ	P,MAKDIR		;MAKE THE DIRECTORY OF IT
	JRST	RENTER			;FILE I/O ERROR
	MOVE	PNT,[XWD DIRECT,FILES]	;SET UP FOR WLDDIR
	MOVE	FILE.,ARROW		;SETUP FILE. SO POINTS TO RIGHT LIST
	ADDI	FILE.,5			;GO JUST BEYOND EXCON FILE NAME
	CAMN	FILE.,FILEND		;IS THERE A RIGHT FILE LIST?
	JRST	ESET			;NO, MARK ALL FILES FOR EXPANDING
MORFIL:	PUSHJ	P,WLDDIR		;GET A FILE, WLDDIR MARKS IT FOR US
	JRST	XPNIT			;NO MORE? GO ENTER THE FILES
	TRNN	F,FILST			;2 FILE LISTS?
	JRST	NOLIST			;NO, SET DEV AND PPN FROM /X
	MOVE	2(PNT)			;GET OUTPUT DEVICE
	MOVEM	2(1)			;STORE IT IN DIRECT
	MOVE	3(PNT)			;GET LEFT LIST PPN
	MOVEM	3(1)			;STORE THAT IN DIRECT
	MOVE	(PNT)			;GET FILE NAME
	CAMN	STAR			;SAME AS INPUT FILE NAME?
	JRST	XPNEXT			;YES, TRY FOR EXTENSION
	MOVE	(1)			;NO, GET NEW ONE
	TDZ	4(PNT)			;GET THE QUESTION MARKS OUT OF NEW FILE
	ADD	(PNT)			;AND PUT CHAR FROM OLD INTO NEW
	MOVEM	(1)			;SAVE IT IN DIRECT
XPNEXT:	HLLZ	1(PNT)			;GET THE EXT
	CAMN	STAR			;SAME EXT AS IN RIGHT LIST?
	JRST	MORFIL			;YES, DONE, GET MORE
	MOVE	1(1)			;GET OLD EXT
	HRLO	2,1(PNT)		;GET QUESTION MARK MASK
	TDZ	2			;ZERO NON-Q MARKS
	ADD	1(PNT)			;ADD IN RIGHT CHARACTERS
	HLLM	1(1)			;STORE IT
	JRST	MORFIL			;GO FOR MORE
NOLIST:	MOVE	XDEV			;GET /X DEVICE
	MOVEM	2(1)			;PUT IT AWAY
	MOVE	XPPN			;GET /X PPN
	MOVEM	3(1)			;PUT IT AWAY IN DIRECT ALSO
	JRST	MORFIL			;GO FOR MORE
ESET:	MOVE	DEV.,XDEV		;MARK ALL, GET PROPER DEV
	MOVE	PPN.,XPPN		;AND PPN
	MOVEI	1,MARK			;PUT MARK HERE FOR READY USE
	SETZ	CNT,			;ZERO CNT INTO DIRECT
	SKIPN	DIRECT(CNT)		;ARE WE AT THE END OF DIRECT?
	JRST	XPNIT+2			;YES, GO EXPAND
	ADDM	1,DIRECT+1(CNT)		;MARK THE FILE FOR EXPANSION
	MOVEM	DEV.,DIRECT+2(CNT)	;SET THE DEVICE
	MOVEM	PPN.,DIRECT+3(CNT)	;AND PPN
	ADDI	CNT,4			;GET TO NEXT FILE IN DIRECT
	JRST	ESET+4			;AND GO FOR MORE
XPNIT:	TRNN	F,FILSPC		;ANY FILES MENTIONED?
	JRST	NOUSE			;NO
	MOVE	1,ARROW			;GET ADR OF EXCON FILE
	PUSHJ	P,INFILE		;SET UP THE INPUT
	JRST	RENTER			;BUM FILE
	MOVEI	XFER,XPNFIN		;SET UP EOF TRANSFER ADR
	SETZ	CNT,			;ZERO CNT INTO DIRECT
XPNIT2:	SKIPN	DIRECT(CNT)		;ANY MORE FILES LEFT?
	JRST	XPNFIN			;NO, DONE!
	MOVE	EXT.,DIRECT+1(CNT)	;GET EXT. AND DATE
	TRNN	EXT.,MARK		;MARKED FOR EXPANSION?
	JRST	NXTXPN			;NO, GO FOR MORE
	PUSH	P,.JBFF			;SAVE OUR CURRENT CORE ASSIGNMENT
	MOVEI	1,DIRECT(CNT)		;GET ADR OF FILE FOR OUTPUT
	PUSHJ	P,OUTFIL		;SET UP OUTPUT
	JRST	NXTXPN			;BUM, CAN'T DO IT
	PUSHJ	P,GETWRD		;GET A PIECE OF DATA
	CAME	BGNCOD			;IS IT THE BEGINNING OF THE FILE?
	JRST	.-2			;NO, GET THAT BEGINGING
	PUSHJ	P,GETWRD		;GET THE FILE NAME
	MOVEM	FILE2.			;SAVE IT
	PUSHJ	P,GETWRD		;GET THE EXTENSION
	HLLM	EXT2.			;SAVE IT
	PUSHJ	P,GETWRD		;GET THE RANDOM NUMBER,,DATE
	HLRM	EXT2.			;SAVE THE RANDOM NUMBER
	JRST	.+2			;ENTER LOOP
DUMPIT:	PUSHJ	P,PUTWRD		;DUMP OUT A WORD
	PUSHJ	P,GETWRD		;GET A WORD
	CAME	ENDCOD			;IS IT POSSIBLE THE END OF THE FILE?
	JRST	DUMPIT			;NO
	PUSHJ	P,GETWRD		;GET THE FILE NAME
	CAME	FILE2.			;SAME AS ONE IN BEGINNING
	JRST	RESTR1			;NO, RESTORE ENDCOD AND FILE NAME
	PUSHJ	P,GETWRD		;GET THE EXT,,RANDOM NUMBER
	CAME	EXT2.			;SAME AS ONE WE'RE EXPANDING?
	JRST	RESTR2			;NO, RESTORE ENDCOD, FILE NAME, EXT
	RELEAS	1,			;YES, FINISH OFF THE FILE
	POP	P,.JBFF			;RESTORE THE PREVIOUS CORE ASSIGNMENT
	JRST	NXTXPN+1		;GO INCREMENT POINTER INTO DIRECT
NXTXPN:	PUSHJ	P,SKPFIL		;DON'T EXPAND THIS FILE, SKIP IT
	ADDI	CNT,4			;INCREMENT INTO NEXT FILE IN DIRECT
	MOVEI	10			;DUMP MODE EXCEPT FOR TTY AND LPT
	TRZE	F,TTYOUT		;DO WE NEED TO MOVE IT?
	MOVEM	OPBLKO			;YES
	JRST	XPNIT2			;GO FOR THE NEXT FILE
XPNFIN:	RELEAS				;HERE WHEN ALL DONE EXPANDING
	RELEAS	1,			;RELEAS ALL CHANELS WE USED
	JRST	RENTER			;TELL THE USER WE CAN TAKE MORE
RESTR1:	PUSH	P,			;SAVE THE FILE NAME
	MOVE	ENDCOD			;RESTORE FIRST WORD WE LOST
	PUSHJ	P,PUTWRD		;PUT IT INTO OUTPUT FILE
	POP	P,			;GET THE FILE NAME
	JRST	DUMPIT			;GO BACK TO MAIN LOOP
RESTR2:	PUSH	P,			;SAVE EXT WE THOUGHT WE HAD
	MOVE	ENDCOD			;RESTORE FIRST WORD WE LOST
	PUSHJ	P,PUTWRD		;DUMP INTO OUTPUT
	MOVE	FILE2.			;GET FILE NAME
	JRST	RESTR1+2		;GO DUMP IT
XPNER2:	POP	P,			;HERE ON OUTPUT FAILURE
	POP	P,			;RESTORE THE PUSH DOWN STACK
	POP	P,.JBFF			;RESTORE THE PREVIOUS CORE ASSIGNMENT
	TRO	F,SKPFLG		;SET SKIP FLAG
	PUSHJ	P,SKPFL.		;AND JUMP INTO MIDDLE OF SKPFIL
	JRST	NXTXPN+1		;GET NEXT FILE
	SUBTTL	FILE DELETION	G. Ross Explorations, Inc.
DELETE:	PUSHJ	P,SAVFIL		;SAVE THE REAL EXT AND USE BAK EXT
	MOVEI	1,FILES			;GET ADR OF INPUT
	PUSHJ	P,MAKDIR		;MAKE THE DIRECTORY
	JRST	RENTER			;BUM FILE, GET OUT
	MOVSI	PNT,DIRECT		;SETUP FOR WLDDIR
	MOVE	FILE.,ARROW		;ALSO FOR WLDDIR
	PUSHJ	P,WLDDIR		;GET A FILE NAME FOR DELETING
	JRST	.+2			;READY TO ACTUALLY DELETE
	JRST	.-2			;GO FOR ANOTHER FILE
	TRNN	F,FILSPC		;WAS A FILE SPECIFIED?
	JRST	DELREN			;NO, RESTORE THE XCN FILE AND BOMB
	MOVEI	1,FILES			;GET ADR OF INPUT EXCON FILE
	PUSHJ	P,INFILE		;SETUP INPUT
	JRST	RENTER			;BUM FILE, GET OUT
	PUSHJ	P,RSTFIL		;RESTORE EXCON FILE NAME
	MOVEI	1,FILES			;GET THE ADR OF THE EXCON FILE
	PUSHJ	P,OUTFIL		;ENTER THE OUTPUT
	JRST	RENTER			;WE TRIED...
	SETZ	CNT,			;ZERO CNT INTO DIRECT
DEL1:	SKIPN	DIRECT(CNT)		;ARE WE DONE
	JRST	DELDON			;YES
	MOVE	DIRECT+1(CNT)		;IS THIS FILE MARKED FOR DELETION?
	TRNN	MARK			;..
	JRST	SAVIT			;NO, PUT IT INTO OUTPUT FILE
	PUSHJ	P,SKPFIL		;YES, SKIP THIS FILE
	ADDI	CNT,4			;GET NEXT FILE IN DIRECT
	JRST	DEL1			;GO CHECK THIS ONE FOR DELETION
SAVIT:	PUSHJ	P,DMPFIL		;DUMP THIS FILE INTO THE OUTPUT FILE
	JRST	SAVIT-2			;AND INCREMENT CNT INTO DIRECT
DELDON:	RELEAS				;DONE!
	RELEAS	1,			;RELEAS BOTH CHANNELS
	JRST	RENTER			;TELL THE USER WE'RE READY FOR MORE
DELREN:	OUTSTR	[ASCIZ/?NO FILES SPECIFIED
/]					;WE TRIED TO HELP HIM
	TRO	F,RENMES		;WE DON'T WANT .BAK FILE MESSAGE TYPED
	MOVEI	1,FILES			;RENAME THE FILE BACK TO WHAT IT WAS
	PUSHJ	P,INFILE		;GET THE FILE
	JRST	RENERR			;WHERE DID THE FILE GO? I HAD IT!
	PUSHJ	P,RSTFIL		;RESTORE THE ORIGINAL FILE NAME
	MOVE	FILE.,FILES		;GET THE FILE NAME
	HLLZ	EXT.,FILES+1		;AND THE EXTENSION
	SETZB	DEV.,PPN.		;LET'S NOT RENAME THE PRO
	RENAME	FILE.			;RENAME IT BACK
	JRST	RENERR			;WE WERE ABLE TO DO IT BEFORE!?
	RELEAS				;GET RID OF THE FILE
	JRST	RENTER			;AND TRY AGAIN
	SUBTTL	FILE LISTING	G. Ross Explorations, Inc.
LIST:	MOVS	PNT,ARROW		;SETUP FOR WLDUFD
	TRNE	F,XSEEN			;WAS THERE A FILE MENTIONED FOR OUTPUT?
	JRST	LDEV			;NO USE /X DEV
	MOVEI	1,FILES			;GET ADR OF OUTPUT FILE
	PUSHJ	P,OUTFIL		;SETUP THE OUTPUT
	JRST	RENTER			;BUM FILE
	JRST	.+2			;SKIP OVER DUMPING BUFFER
LIST2:	PUSHJ	P,OUTIT			;DUMP RET OF BUFFER
	PUSHJ	P,WLDUFD		;GET A FILE TO LIST
	JRST	LFIN			;DONE
	MOVEI	1,FILE.			;SET ADR OF FILE TO LIST AS RETURNED BY WLDUFD
	PUSHJ	P,XCNCHK		;CHECK FOR .XCN EXTENSION
	JRST	LIST2			;BUM FILE TO BEGIN WITH
	RELEAS				;XCNCHK DOES NOT RELEAS THE FILE
	PUSH	P,PNT			;SAVE PNT
	PUSHJ	P,MAKDIR		;MAKE THE DIRECTORY
	JRST	LIST2			;BUM FILE
	SETZ	CNT,			;ZERO CNT INTO DIRECT
TYPOUT:	MOVEI	1,CRLF			;DUMP OUT A RETURN
	PUSHJ	P,PUTSTR		;..
	SKIPN	1,DIRECT(CNT)		;ARE WE DONE WITH THIS EXCON FILE?
	JRST	NXTLST			;YES
	PUSHJ	P,PUTSIX		;DUMP THE FILE NAME
	MOVEI	1,[ASCIZ/  /]		;DUMP A COUPLE BLANKS
	PUSHJ	P,PUTSTR		;..
	HLLZ	1,DIRECT+1(CNT)		;GET THE EXT
	PUSHJ	P,PUTSIX		;DUMP IT
	HRRZ	DIRECT+1(CNT)		;GET THE DATE
	PUSHJ	P,PUTDAT		;DUMP IT
	ADDI	CNT,4			;GET NEXT FILE ADR IN DIRECT
	JRST	TYPOUT			;GO LIST IT
LDEV:	MOVE	FILE.,[SIXBIT/EXCON/]	;HERE IF /X, ASSUME EXCON.OUT IF DSK
	MOVSI	EXT.,'OUT'		;..
	MOVE	DEV.,XDEV		;GET THE RIGHT DEVICE
	MOVE	PPN.,XPPN		;AND PPN (IF DSK)
	MOVEI	1,FILE.			;SET ADR OF OUTPUT FILE
	JRST	LIST+4			;GO SETUP OUTPUT FILE
LFIN:	MOVEI	1,CRLF			;DONE, GIVE A FINAL RETURN
	PUSHJ	P,PUTSTR		;DUMP IT
	RELEAS	1,			;GET RID OF THE CHANNEL
	MOVEI	10			;RESTORE THE RIGHT MODE
	MOVEM	OPBLKO			;OF OPBLKO
	JRST	RENTER			;AND ASK FOR MORE
NXTLST:	IDIVI	CNT,4			;PRINTING TOTALS; GET NUMBER OF FILES
	POP	P,PNT			;RESTORE PNT
	MOVEI	1,[ASCIZ/
Total of /]				;PRINT INTRO TO NUMBER OF FILES
	PUSHJ	P,PUTSTR		;DUMP IT
	MOVE	CNT			;GET CNT IN AC0 FOR DEC PNTING
	PUSHJ	P,PUTDEC		;DUMP IT
	MOVEI	1,[ASCIZ/ file/]	;INDENTIFY THE NUMBER WE TYPED
	PUSHJ	P,PUTSTR		;DUMP IT
	MOVEI	"s"			;REMEMBER TO PUT AN S ON
	CAIE	CNT,1			;BUT ONLY IF NOT = 1
	PUSHJ	P,PUTCHR		;DUMP THAT S
	MOVEI	1,[ASCIZ/ in /]		;PREVIEW TO FILE NAME
	PUSHJ	P,PUTSTR		;DUMP IT
	MOVE	1,FILE.			;GET ADR OF FILE
	PUSHJ	P,PUTSXN		;DUMP IT WITH NO TRAILING BLANKS
	HLLZ	1,EXT.			;GET THE EXT
	JUMPE	1,.+4			;NULL EXT? DON'T PRINT IT
	MOVEI	"."			;PRINT A PERIOD
	PUSHJ	P,PUTCHR		;DUMP IT
	PUSHJ	P,PUTSIX		;PRINT THE EXTENSION
	MOVEI	1,CRLF			;GIVE A RETURN
	PUSHJ	P,PUTSTR		;DUMP IT
	JRST	LIST2			;GO FOR MORE
	SUBTTL	FILE COMPACTING	G. Ross Explorations, Inc.
COMPAC:	HLLZ	FILES+1			;GET THE EXCON EXTENSION
	JUMPN	.+3			;DON'T TOUCH THE EXT IF THERE
	MOVSI	'XCN'			;OTHERWISE ASSUME .XCN
	HLLM	FILES+1			;STORE IT FOR OUTFIL
	MOVEI	1,FILES			;GET ADR OF EXCON FILE NAME
	PUSHJ	P,OUTFIL		;SETUP OUTPUT FILE
	JRST	RENTER			;BUM FILE
	MOVS	PNT,ARROW		;SETUP FOR WLDUFD
	HRRI	PNT,FILES+5		;MORE SETUP
	SETZB	4,DIRECT		;DIRECT WILL CONTAIN NAMES ALREADY COMPACTED
MORCOM:	PUSHJ	P,WLDUFD		;GET A FILE TO COMPACT
	JRST	COMDON			;DONE!
	PUSH	P,PNT			;SAVE PNT
	MOVE	3,.JBFF##		;SAVE HILOC TO RECLAIM INPUT BUFFER LATER
	MOVEI	1,FILE.			;GET ADR OF INPUT FILE NAME
	PUSHJ	P,INFILE		;SETUP THE INPUT
	JRST	POPPNT			;BUM FILE, RESTORE PNT, GO FOR MORE
	POP	P,PNT			;RESTORE PNT
	PUSHJ	P,NEWFIL		;GET FILE NAME FOR OUTPUT TO EXCON FILE
	PUSHJ	P,FNDFIL		;SEE IF NAME ALREADY COMPACTED
	JRST	MORCOM			;YES, SKIP THIS FILE
	CAIL	4,<DIRFIL*4>		;CAN WE STORE IT IN DIRECT?
	JRST	STPCOM			;NO, STOP COMPACTING
	MOVEM	FILE2.,DIRECT(1)	;STORE OUTPUT FILE NAME IN DIRECT
	MOVEM	EXT2.,DIRECT+1(1)	;AND ALSO THE EXTENSION
	ADDI	4,4			;GET TO ADR OF NEXT FILE SLOT
	SETZM	DIRECT(4)		;ZEROED TO DETERMINE END OF DIRECT
	PUSHJ	P,COMIT			;COMPACT THE FILE
	RELEAS				;RELEAS THE INPUT FILE
	MOVEM	3,.JBFF			;RECLAIM BUFFER SPACE
	JRST	MORCOM			;GO COMPACT MORE
COMDON:	RELEAS	1,			;RELEAS THE OUTPUT FILE
	JRST	RENTER			;GO ASK FOR MORE WORK
POPPNT:	POP	P,PNT			;ERROR RETURN FROM INFILE,RESTORE PNT
	JRST	MORCOM			;GO FOR MORE COMPACTING
STPCOM:	OUTSTR	[ASCIZ/?TOO MANY SUBFILES TO COMPACT
/]					;WE OVERFLOWED DIRECT
	RELEAS	1,			;LET THE FILE BE
	JRST	RENTER			;AND GO FOR MORE WORK
	SUBTTL	FILE ADDING	G. Ross Explorations, Inc.
ADD:	PUSHJ	P,SAVFIL		;SAVE THE REAL EXCON NAME, PUT .BAK IN
	MOVEI	1,FILES			;GET ADR OF EXCON FILE
	PUSHJ	P,MAKDIR		;MAKE THE DIRECTORY OF THE FILE
	JRST	RENTER			;BUM FILE, GET OUT
	MOVS	PNT,ARROW		;SET UP FOR WLDUFD
	HRRI	PNT,FILES+5		;ALSO SET UP FOR WLDUFD
ADDMOR:	PUSHJ	P,WLDUFD		;GET A FILE TO ADD
	JRST	ADDCHK			;DONE FIRST SCAN
	PUSHJ	P,NEWFIL		;GET THE FILE NAME FROM LEFT FILE LIST
	PUSHJ	P,FNDFIL		;IS IT IN DIRECT?
	JRST	ADDMOR			;NO, FILE ALL RIGHT TO ADD
	JRST	ADDMOR			;YES, BUT IT WAS MARKED BY FNDFIL
ADDCHK:	MOVEI	1,FILES			;GET ADR OF EXCON FILE
	PUSHJ	P,INFILE		;SETUP INPUT
	JRST	RENTER			;BUM FILE, GET OUT
	PUSHJ	P,RSTFIL		;RESTORE THE REAL EXCON NAME
	MOVEI	1,FILES			;GET THE ADR OF THE EXCON FILE AGAIN
	PUSHJ	P,OUTFIL		;SET UP THE OUTPUT FILE
	JRST	RENTER			;BUM FILE, GET OUT
	SETZ	CNT,			;ZERO CNT INTO DIRECT
	MOVEI	XFER,ADDEOF		;IF WE GET AN EOF UNEXPECTEDLY
	TRO	F,SKPFLG		;MAKE SURE THE POP CHAIN IS RIGHT
GETMOR:	SKIPN	DIRECT(CNT)		;ARE WE AT THE END OF DIRECT?
	JRST	ADDONE			;YES, GO COMPAC
	MOVE	DIRECT+1(CNT)		;GET THE EXTENSION
	TRNE	MARK			;IS IT MARKED FOR DELETION?
	JRST	DELIT			;YES, DELETE IT
	PUSHJ	P,DMPFIL		;NO, DUMP IT INTO THE OUTPUT FILE
	ADDI	CNT,4			;GET NEXT FILE IN DIRECT
	JRST	GETMOR			;AND SEE ABOUT THAT ONE
DELIT:	PUSHJ	P,SKPFIL		;SKIP OVER THE FILE
	JRST	DELIT-2			;AND GO INCREMENT THE FILE COUNTER
ADDEOF:	MOVE	ENDCOD			;UNEXPECTED EOF; MAKE IT EXPECTED
	PUSHJ	P,PUTWRD		;PUT AN ENDCOD
	MOVE	FILE2.			;GET THE FILE NAME
	PUSHJ	P,PUTWRD		;PUT THAT IN THE OUTPUT FILE
	MOVE	EXT2.			;GET THE EXT,,RANDOM NUMBER
	PUSHJ	P,PUTWRD		;AND PUT THAT OUT
ADDONE:	RELEAS				;RELEAS THE INPUT
	TRZ	F,SKPFLG!FILINC		;TURN OFF FOR WLDUFD AND POPING RIGHT
	JRST	MORCOM-3		;AND START COMPACTING
	SUBTTL	SUBROUTINES	G. Ross Explorations, Inc.
;
;	GETFIL GETS ONE FILE OFF THE TTY AND PROCESS ANY SWITCHES,
;	BACK ARROWS, EXTRANIOUS CHARACTERS, ETC...
;	THE FILE IS PLACED IN @FILPTR, AND FILPTR IS INCREMENTED
;	BY FIVE AFTERWARDS.  THE FORMAT IS:
;
;	SIXBIT/FILE/
;	XWD "EXT",EXT Q MARK MASK
;	SIXBIT/DEVICE
;	XWD	P,PN
;	FILE Q MARK MASK
;
;	WHERE Q MARK MASK IS 0 WHERE A QUESTION MARK(S) IS SEEN
;	OTHERWISE FILLED WITH ONES
;
;	RETURN IS TO CALL+1 IF NO MORE IS WAITING FROM THE TTY
;	OTHERWISE CALL+2
;
;	CMDCHR IS THE ROUTINE THAT GETS ONE CHARACTER OFF THE TTY
;	CHECKS FOR VALIDITY AND PASSES IT BACK IN AC0
;
GETFIL:	SKIPN	DEV.,CURDEV
	JRST	CPOPJ1
	MOVEI	3,6
	MOVE	5,[POINT 6,FILES]
	ADD	5,FILPTR
	MOVE	4,[POINT 6,FILES+4]
	ADD	4,FILPTR
	MOVEM	DEV.,2(5)
	MOVE	JOBPPN
	MOVEM	3(5)
	HRRZI	-1
	MOVEM	1(5)
	SETZM	(5)
	SETOM	(4)
	TRZ	F,FILSEN
NXTCHR:	PUSHJ	P,CMDCHR
	MOVEI	2,BRKCNT
	MOVE	1,BRKTAB(2)
	CAIN	(1)
	JRST	BREAK
	SOJGE	2,.-3
	SOJL	3,NXTCHR
	IBP	4
	CAIE	"?"
	JRST	.+4
	SETZ
	DPB	4
	JRST	TAKCHR+1
TAKCHR:	SUBI	40
	IDPB	5
	TRO	F,FILSEN
	JRST	NXTCHR
BREAK:	MOVS	1,1
	JRST	(1)
BRKTAB:	XWD	CR,0
	XWD	CONTIN,"+"
	XWD	SWITCH,"/"
	XWD	DEVICE,":"
	XWD	EXT,"."
	XWD	BAKARW,"←"
	XWD	BAKARW,"="
	XWD	COMMA,","
	XWD	RUNIT,"!"
	XWD	PPN,"["
	XWD	NXTCHR,40
	XWD	NXTCHR,11
	BRKCNT=.-BRKTAB-1
CR:	TRNN	F,CHRTYP
	JRST	RENTER
	SETZM	CURDEV
	MOVE	1,FILPTR
	MOVEI	1,FILES(1)
	TRNE	F,FILSEN
	ADDI	1,5
	MOVEM	1,FILEND
	POPJ	P,
BAKARW:	TROE	F,ARWSEN
	JRST	MNYARW
	TRNN	F,FILSEN
	JRST	SETARW
	MOVEI	1,FILES+5
	ADD	1,FILPTR
	MOVEM	1,ARROW
	MOVSI	'DSK'
	MOVEM	CURDEV
COMMA:	MOVEI	5
	ADDM	FILPTR
	POPJ	P,
SETARW:	MOVEI	FILES
	ADD	FILPTR
	MOVEM	ARROW
	MOVSI	'DSK'
	MOVEM	CURDEV
	JRST	GETFIL
DEVICE:	MOVE	(5)
	SETZM	(5)
	MOVEM	2(5)
	MOVEM	CURDEV
	HRLI	5,440600
	HRLI	4,440600
	SETOM	(4)
	MOVEI	3,6
	JRST	NXTCHR
EXT:	MOVEI	3,3
	HRLI	4,220600
	SUBI	4,3
	HRLI	5,440600
	AOJA	5,NXTCHR
RUNIT:	PUSHJ	P,CMDCHR
	JUMPN	RUNIT
	MOVE	1,FILPTR
	MOVE	10,FILES+2(1)
	MOVE	11,FILES(1)
	HLLZ	12,FILES+1(1)
	SETZ	13,
	MOVE	14,FILES+3(1)
	SETZ	15,
	MOVE	[XWD 10,DIRECT]
	BLT	DIRECT+5
	MOVE	[XWD 1,DIRECT]
	RUN
	HALT
SWITCH:	PUSHJ	P,CMDCHR
	JUMPE	BADFNC
	CAIN	"H"
	JRST	HELP
	CAIN	"X"
	JRST	XSWIT
	CAIN	40
	JRST	SWITCH+2
	TLNE	F,A!C!D!E!L
	JRST	DBLSWI
	MOVEI	2,SWCNT
	MOVE	1,SWTAB(2)
	CAIN	(1)
	JRST	SWFIND
	SOJGE	2,.-3
	JRST	BADSWI
XSWIT:	TRO	F,XSEEN
	MOVE	3(5)
	MOVEM	XPPN
	MOVE	CURDEV
	MOVEM	XDEV
	TRZ	F,FILSEN
	JRST	NXTCHR
SWFIND:	HLL	F,1
	SKIPN	(5)
	JRST	XSWIT
	JRST	NXTCHR
SWTAB:	XWD	A,"A"
	XWD	C,"C"
	XWD	D,"D"
	XWD	E,"E"
	XWD	L,"L"
	SWCNT=.-SWTAB-1
PPN:	MOVE	2,FILPTR
	SETZ	1,
	PUSHJ	P,CMDCHR
	JUMPE	PPNFIN
	CAIN	40
	JRST	PPN+2
	CAIE	"←"
	CAIN	"="
	JRST	PPNBF
	CAIN	"]"
	JRST	PPNBAK
	CAIN	","
	JRST	PPNHAF
	CAIN	"!"
	JRST	PPNRUN
	CAILE	"7"
	JRST	BADPPN
	SUBI	60
	TRNE	1,700000
	JRST	ILLCHR
	LSH	1,3
	ADD	1,
	JRST	PPN+2
PPNFIN:	HRRM	1,FILES+3(2)
	JRST	CR
PPNBF:	HRRM	1,FILES+3(2)
	TRNN	F,XSEEN
	JRST	.+3
	MOVE	1,FILES+3(2)
	MOVEM	1,XPPN
	JRST	BAKARW
PPNBAK:	HRRM	1,FILES+3(2)
	JRST	NXTCHR
PPNHAF:	HRLM	1,FILES+3(2)
	JRST	PPN+1
PPNRUN:	HRRM	1,FILES+3(2)
	JRST	RUNIT
CONTIN:	OUTCHR	["*"]
	PUSHJ	P,CMDCHR
	JUMPN	.-1
	MOVEI	5
	ADDM	FILPTR
	POPJ	P,
CPOPJ1:	AOS	(P)
CPOPJ:	POPJ	P,
CMDCHR:	SKIPE	CCL
	PUSHJ	P,CCLCHR
	INCHWL
	CAIN	32
	EXIT
	CAIE	33
	CAIN	175
	JRST	ALTMOD
	CAIN	15
	JRST	GETLF
	CAIN	12
	JRST	ALTMOD
	TRO	F,CHRTYP
	TRNE	F,ANYCHR
	POPJ	P,
	PUSH	P,1
	CAIE	"*"
	JRST	.+3
	HLLZ	1,(5)
	JUMPE	1,GODCHR+1
	PUSH	P,2
	MOVEI	2,BRKCNT
	MOVE	1,BRKTAB(2)
	CAIN	(1)
	JRST	GODCHR
	SOJGE	2,.-3
	POP	P,2
	POP	P,1
	CAIE	"?"
	CAIN	"]"
	POPJ	P,
	CAIGE	"0"
	JRST	ILLCHR
	CAIG	"9"
	POPJ	P,
	CAIL	"A"
	CAILE	"Z"
	JRST	ILLCHR
	POPJ	P,
GETLF:	SKIPE	CCL
	PUSHJ	P,CCLCHR
	INCHWL
ALTMOD:	SETZ
	POPJ	P,
GODCHR:	POP	P,2
	POP	P,1
	POPJ	P,
CCLCHR:	ILDB	CCLPNT
	JUMPN	CPOPJ1
	SETZM	CCL
	EXIT	1,
	EXIT
HELP:	PUSHJ	P,EATMUP
	OPEN	SYSBLK
	JRST	NOHELP
	LOOKUP	SYSHLP
	JRST	NOHELP
	SETZM	DIRECT+200
	IN	HLPWRD
	JRST	.+2
	JRST	FIN
	OUTSTR	DTANAM
	JRST	HELP+6
FIN:	RELEAS
	JRST	RENTER
;
;	GETWRD GETS ONE WORD OF DATA FROM CHANNEL 0
;	IF AN EOF IS FOUND CONTROL IS TRANSFERED TO (XFER)
;	THROUGH DATAIN.  SKPFLG IS USED TO DETERMINE IF ANOTHER
;	POP IS NEEDED TO RESTORE THE PUSH DOWN STACK RIGHT
;
GETWRD:	SOSGE	IBUF+2
	JRST	MORDAT
	ILDB	IBUF+1
	POPJ	P,
MORDAT:	PUSHJ	P,DATAIN
	JRST	GETWRD
;
;	PUTWRD PUTS ONE WORD OF DATA OUT ON CHANNEL 1
;	FAILURE BOMBS THE CURRECT EXCON COMMAND AND RETURNS TO
;	COMMAND LEVEL EXCEPT IN THE CASE OF /E WHERE IT GOES TO 
;	A SPECIAL ROUTINE TO TIE UP ENDS
;
PUTWRD:	TRNE	F,TTYOUT
	JRST	TTYCHR
	SOSGE	OBUF+2
	JRST	OUTDAT
	IDPB	OBUF+1
	POPJ	P,
TTYCHR:	PUSH	P,1
	PUSH	P,2
	MOVEI	2,4
	MOVEM	1
	LSHC	7
	PUSHJ	P,PUTWRD+2
	SOJGE	2,.-2
	POP	P,2
	POP	P,1
	POPJ	P,
OUTDAT:	PUSHJ	P,OUTIT
	JRST	PUTWRD+2
DATAIN:	IN
	POPJ	P,
	POP	P,
	POP	P,
	TRZE	F,SKPFLG
	POP	P,
	STATZ	20000
	JRST	(XFER)
	PUSHJ	P,INERR
	JRST	(XFER)
OUTIT:	OUT	1,
	POPJ	P,
	PUSHJ	P,OUTERR
	TLNE	F,E
	JRST	XPNER2
	RELEAS	1,
	RELEAS
	JRST	RENTER
NODEV:	MOVE	1,2(1)
	OUTSTR	[ASCIZ/?DEVICE /]
	PUSHJ	P,SIXPNT
	OUTSTR	[ASCIZ/ DOES NOT EXIST
/]
	JRST	RENTER
NODSK:	MOVSI	1,'DSK'
	JRST	NOTAVL+1
NOTAVL:	MOVE	1,2(1)
	OUTSTR	[ASCIZ/?DEVICE /]
	PUSHJ	P,SIXPNT
	OUTSTR	[ASCIZ/ IS NOT AVAILABLE
/]
	JRST	RENTER
FILINR:	HLLI	EXT.,
	MOVE	DEV.,OPBLKI+1
	OUTSTR	[ASCIZ/?LOOKUP FAILURE ON FILE /]
	PUSHJ	P,FILPNT
	JRST	RENTER
	HLLI	EXT.,
	MOVE	DEV.,OPBLKO+1
	OUTSTR	[ASCIZ/?ENTER FAILURE ON FILE /]
	PUSHJ	P,FILPNT
	JRST	RENTER
;
;	FILPNT TAKES THE FILE IN ACS FILE. THROUGH PPN. AND
;	PRINTS IT ALONG WITH AN ERROR CODE DETERMINED FROM
;	RIGHT HALF OF THE EXT.
;
FILPNT:	HRRZ	3,EXT.
	IDIVI	3,2
	MOVE	3,ERRTAB(3)
	JUMPN	4,.+2
	HLRZ	3,3
	MOVE	DEV.
	DEVCHR
	TLNN	DV.DTA
	JRST	.+4
	CAIN	3,PROTEC
	MOVEI	3,DTAFUL
	TRO	F,TYPPPN
	MOVE	1,DEV.
	PUSHJ	P,SIXPNT
	OUTCHR	[":"]
	TRNE	F,UFDERR
	JRST	SETPPN
	MOVE	1,FILE.
	PUSHJ	P,SIXPNT
	HLLZ	1,EXT.
	JUMPE	1,.+3
	OUTCHR	["."]
	PUSHJ	P,SIXPNT
	TRZE	F,TYPPPN
	JRST	PNTERR
PNTPPN:	OUTCHR	["["]
	HLRZ	PPN.
	PUSHJ	P,OCTPNT
	OUTCHR	[","]
	HRRZ	PPN.
	PUSHJ	P,OCTPNT
	OUTCHR	["]"]
	TRNE	F,UFDERR
	OUTSTR	[ASCIZ/.UFD/]
PNTERR:	OUTSTR	(3)
	POPJ	P,
SETPPN:	MOVE	PPN.,FILE.
	JRST	PNTPPN
RENER2:	HRR	EXT.,ZEROS+1
RENERR:	OUTSTR	[ASCIZ/?RENAME FAILURE ON FILE /]
	MOVSI	DEV.,'DSK'
	MOVE	PPN.,JOBPPN
	PUSHJ	P,FILPNT
	TRNN	F,RENMES
	OUTSTR	[ASCIZ/?UNABLE TO FORM BACKUP FILE
/]
	JRST	RENTER
;
;	SIXPNT DUMPS AC 1 ON THE TTY WITH TRAILING BLANKS IGNORED
;
SIXPNT:	SETZ
	LSHC	6
	ADDI	40
	OUTCHR
	JUMPE	1,CPOPJ
	JRST	SIXPNT
;
;	OCTPNT PRINTS AC 0 AS AN OCTAL NUMBER ON THE TTY
;
OCTPNT:	IDIVI	10
	HRLM	1,(P)
	SKIPE
	PUSHJ	P,OCTPNT
	HLRZ	(P)
	ADDI	60
	OUTCHR
	POPJ	P,
BADEV:	MOVE	1,2(1)
	OUTSTR	[ASCIZ/?ILLEGAL DEVICE /]
	PUSHJ	P,SIXPNT
	OUTSTR	CRLF
	JRST	RENTER
;
;	USING A POINTER GIVEN IN AC 1, INFILE LOADS FILE. THROUGH PPN.
;	AND PERFORMS A LOOKUP ON THAT FILE.  IF SUCCESSFUL, CONTROL RETURNS
;	TO CALL+2, OTHERWISE CALL+1.  IF AN ERROR DOES OCCUR, IT IS
;	PRINTED ON THE TTY
;
INFILE:	MOVE	FILE.,(1)
	MOVE	EXT.,1(1)
	MOVE	PPN.,3(1)
	MOVE	DEV.,2(1)
	MOVEM	DEV.,OPBLKI+1
	DEVCHR	DEV.,
	JUMPE	DEV.,NODEV
	OPEN	OPBLKI
	JRST	NOTAVL
	PUSH	P,PPN.
	LOOKUP	FILE.
	JRST	INFERR
	POP	P,PPN.
	LDB	DATE.,[POINT 3,EXT.,20]
	LSH	DATE.,↑D12
	TDZ	DEV.,[XWD -1,770000]
	ADD	DATE.,DEV.
	MOVE	DEV.,OPBLKI+1
	IN
	JRST	CPOPJ1
	STATZ	20000
	JRST	CPOPJ1
	PUSHJ	P,INERR
	RELEAS
	POPJ	P,
INFERR:	OUTSTR	[ASCIZ/?LOOKUP FAILURE ON FILE /]
	MOVE	DEV.,OPBLKI+1
	PUSHJ	P,FILPNT
	RELEAS
	POP	P,PPN.
	POPJ	P,
;
;	AS IN INFILE, THIS IS THE SAME EXCEPT AN ENTER IS PERFORMED
;
OUTFIL:	MOVE	2(1)
	MOVEM	OPBLKO+1
	DEVCHR
	JUMPE	NODEV
	TLNE	F,L
	SETZM	OPBLKO
	TLNN	DV.TTY!DV.LPT
	JRST	.+3
	TRO	F,TTYOUT
	SETZM	OPBLKO
	OPEN	1,OPBLKO
	JRST	NOTAVL
	TRNE	F,TTYOUT
	JRST	OTFERR-5
	MOVE	FILE.,(1)
	HLLZ	EXT.,1(1)
	MOVE	PPN.,3(1)
	HRRZ	DEV.,EXT.
	HRRZ	EXT.
	LSH	-↑D12
	DPB	[POINT 3,EXT.,20]
	PUSH	P,PPN.
	ENTER	1,FILE.
	JRST	OTFERR
	POP	P,PPN.
	OUT	1,
	JRST	CPOPJ1
	PUSHJ	P,OUTERR
	RELEAS	1,
	POPJ	P,
OTFERR:	OUTSTR	[ASCIZ/?ENTER FAILURE ON FILE /]
	MOVE	DEV.,OPBLKO+1
	POP	P,PPN.
	PUSHJ	P,FILPNT
	RELEAS	1,
	POPJ	P,
;
;	SKPFIL PASSES THROUGH ONE SUBFILE OF THE EXCON FILE ON CHANNEL 0
;
SKPFIL:	TRO	F,SKPFLG
	PUSHJ	P,GETWRD
	CAME	BGNCOD
	JRST	SKPFIL+1
	PUSHJ	P,GETWRD
	MOVEM	FILE2.
	PUSHJ	P,GETWRD
	HLLM	EXT2.
	PUSHJ	P,GETWRD
	HLRM	EXT2.
SKPFL.:	PUSHJ	P,GETWRD
	CAME	ENDCOD
	JRST	SKPFL.
	PUSHJ	P,GETWRD
	CAME	FILE2.
	JRST	SKPFL.
	PUSHJ	P,GETWRD
	CAME	EXT2.
	JRST	SKPFL.
	TRZ	F,SKPFLG
	POPJ	P,
;
;	MAKDIR FORMS A DIRECTORY OF THE EXCON FILE POINTED TO BY AC 1
;	IN DIRECT.  ENTRIES ARE:
;
;	SIXBIT/FILE/
;	XWD "EXT", DATE
;	SIXBIT/DEVICE/
;	PPN
;
MAKDIR:	PUSHJ	P,INFILE
	POPJ	P,
	MOVEI	XFER,MDFIN
	SETZ	CNT,
	PUSHJ	P,GETWRD
	CAME	BGNCOD
	JRST	.-2
	PUSHJ	P,GETWRD
	MOVEM	DIRECT(CNT)
	PUSHJ	P,GETWRD
	MOVEM	DIRECT+1(CNT)
	HLL	EXT2.,
	PUSHJ	P,GETWRD
	HRRM	DIRECT+1(CNT)
	HLR	EXT2.,
	MOVE	FILE2.,DIRECT(CNT)
	TRO	F,SKPFLG
	PUSHJ	P,SKPFL.
	ADDI	CNT,4
	CAIGE	CNT,<DIRFIL*4>
	JRST	MAKDIR+4
	OUTSTR	[ASCIZ/?TOO MANY SUBFILES IN /]
	PUSHJ	P,PNTFIL
MDFIN:	RELEAS
	SETZM	DIRECT(CNT)
	JRST	CPOPJ1
INERR:	GETSTS
	OUTSTR	[ASCIZ/?READ ERROR /]
	SETZ	3,
	MOVEI	2,FILE.
	TLNE	F,E
	MOVE	2,ARROW
INERR2:	PUSH	P,
	PUSHJ	P,OCTPNT
	OUTSTR	[ASCIZ/ ON /]
	MOVE	1,2(2)
	PUSHJ	P,SIXPNT
	OUTCHR	[":"]
	MOVE	1,(2)
	JUMPE	1,NOFNAM
	PUSHJ	P,SIXPNT
	HLLZ	1,1(2)
	JUMPE	1,.+3
	OUTCHR	["."]
	PUSHJ	P,SIXPNT
	MOVE	3
	DEVCHR
	TLNE	DV.DTA
	JRST	NOFNAM
	OUTCHR	["["]
	HLRZ	3(2)
	PUSHJ	P,OCTPNT
	HRR	3(2)
	OUTCHR	[","]
	PUSHJ	P,OCTPNT
	OUTSTR	[BYTE (7) "]", 15, 12]
NOFNAM:	POP	P,
	SETZ	1,
	TRNE	IO.IMP
	MOVEI	1,DEVWL
	TRNE	IO.DTE
	MOVEI	1,DEVPAR
	TRNE	IO.BKT
	MOVEI	1,DEVBKT
	JUMPN	1,TYPMES
	TRNN	IO.DER
	JRST	CPOPJ
	MOVEI	1,DEVSEK
	MOVE	3
	DEVCHR
	TLNE	DV.DTA
	MOVEI	1,DEVDAT
TYPMES:	OUTSTR	(1)
	POPJ	P,
OUTERR:	GETSTS	1,
	OUTSTR	[ASCIZ/?WRITE ERROR /]
	MOVEI	3,1
	MOVEI	2,FILES
	TLNE	F,E
	MOVEI	2,FILE.
	JRST	INERR2
;
;	WLDDIR IS A SUBROUTINE TO FIND AND MARK FILES IN DIRECT.
;	ON RETURN (TO CALL+2, IF CALL+1--DONE) AC 1 CONTAINS A POINTER
;	TO THE MARKED FILE.  AC PNT CONTAINS XWD DIRECT,,ADR OF LEFT FILE
;	LIST ON STARTUP; AC FILE. THE ADR OF THE RIGHT FILE LIST.
;	PNT, AND FILE. ARE INCREMENTED AUTOMATICALLY WITH THE RIGHT
;	HALF OF PNT POINTING TO THE LEFT FILE LIST.
;
WLDDIR:	CAMN	FILE.,FILEND
	POPJ	P,
	HLRZ	3,PNT
	MOVE	(3)
	JUMPE	UPDATE
	MOVE	1,(FILE.)
	CAMN	1,STAR
	JRST	WLDEXT
	AND	4(FILE.)
	CAME	(FILE.)
	JRST	UPDAT1
WLDEXT:	HLLZ	1(FILE.)
	CAMN	STAR
	JRST	GOTIT
	MOVE	1,1(3)
	HRLZ	2,1(FILE.)
	AND	1,2
	CAME	1
	JRST	UPDAT1
GOTIT:	MOVE	1(3)
	TROE	MARK
	JRST	UPDAT1
	TRO	F,FILSPC
	MOVEM	1(3)
	MOVE	1,3
	ADD	PNT,[XWD 4,0]
	PUSHJ	P,WLDCHK
	JRST	CPOPJ1
	HRLI	PNT,DIRECT
	ADDI	PNT,5
	ADDI	FILE.,5
	JRST	CPOPJ1
UPDAT1:	ADD	PNT,[XWD 4,0]
	JRST	WLDDIR+2
UPDATE:	ADDI	PNT,5
	ADDI	FILE.,5
	HRLI	PNT,DIRECT
	JRST	WLDDIR
;
;	WLDCHK CHECKS TO SEE IF THE FILE IN LOCATION @1 IS A VALID
;	FILE NAME OR HAS STARS AND/OR QUESTION MARKS IN IT. RETURNS
;	ARE TO CALL+1 IF WILD OR TO CALL+2 IF THE FILE IS VALID.
;
WLDCHK:	MOVE	4(1)
	CAME	[-1]
	POPJ	P,
	HRRO	1(1)
	CAME	[-1]
	POPJ	P,
	MOVE	(1)
	CAMN	STAR
	POPJ	P,
	HLLZ	1(1)
	CAMN	STAR
	POPJ	P,
	JRST	CPOPJ1
NOUSE:	OUTSTR	[ASCIZ/?NO FILES SPECIFIED
/]
	JRST	RENTER
;
;	DMPFIL IS SIMILAR TO SKPFIL EXCEPT THAT THE INPUT IS PASSED TO
;	THE OUTPUT FILE RATHER THAN BEING JUST DUMPED INTO OBLIVIATION
;
DMPFIL:	PUSHJ	P,GETWRD
	PUSHJ	P,PUTWRD
	CAME	BGNCOD
	JRST	DMPFIL
	PUSHJ	P,GETWRD
	PUSHJ	P,PUTWRD
	MOVEM	FILE2.
	PUSHJ	P,GETWRD
	PUSHJ	P,PUTWRD
	HLLM	EXT2.
	PUSHJ	P,GETWRD
	HLRM	EXT2.
DMP1:	PUSHJ	P,PUTWRD
	PUSHJ	P,GETWRD
	CAME	ENDCOD
	JRST	DMP1
	PUSHJ	P,PUTWRD
	PUSHJ	P,GETWRD
	CAME	FILE2.
	JRST	DMP1
	PUSHJ	P,PUTWRD
	PUSHJ	P,GETWRD
	CAME	EXT2.
	JRST	DMP1
	PUSHJ	P,PUTWRD
	POPJ	P,
;
;	PUTDAT PRINTS THE DATE GIVEN IN AC0 ON CHANNEL 1
;
PUTDAT:	PUSH	P,2
	PUSH	P,3
	MOVEM	2
	IDIVI	2,↑D31
	MOVEI	40
	CAIGE	3,↑D9
	PUSHJ	P,PUTCHR
	MOVEI	1(3)
	PUSHJ	P,PUTDEC
	MOVEI	"-"
	PUSHJ	P,PUTCHR
	IDIVI	2,↑D12
	MOVEI	1,MONTHS(3)
	PUSHJ	P,PUTSTR
	MOVEI	↑D64(2)
	PUSHJ	P,PUTDEC
	POP	P,3
	POP	P,2
	POPJ	P,
;
;	PUTSTR PUTS THE ASCIZ STRING ADDRESSED BY AC 1 INTO THE OUTPUT FILE
;
PUTSTR:	HRLI	1,440700
	ILDB	1
	JUMPE	CPOPJ
	PUSHJ	P,PUTCHR
	JRST	PUTSTR+1
;
;	PUTCHR DUMPS THE CHARACTER IN AC0 INTO THE OUTPUT BUFFER
;
PUTCHR:	SOSGE	OBUF+2
	JRST	PUTOUT
	IDPB	OBUF+1
	POPJ	P,
PUTOUT:	PUSHJ	P,OUTIT
	JRST	PUTCHR
;
;	PUTSIX DUMPS THE SIXBIT WORD IN AC1 WITH TRAILING BLANKS
;
PUTSIX:	PUSH	P,2
	MOVEI	2,5
	SETZ
	LSHC	6
	ADDI	40
	PUSHJ	P,PUTCHR
	SOJGE	2,PUTSIX+2
	POP	P,2
	POPJ	P,
;
;	PUTSXN IS THE SAME AS PUTSIX BUT TRAILING BLANKS ARE NOT PRINTED
;
PUTSXN:	SETZ
	LSHC	6
	ADDI	40
	PUSHJ	P,PUTCHR
	JUMPN	1,PUTSXN
	POPJ	P,
;
;	PUTDEC DUMPS AC0 AS A DECIMAL NUMBER ON THE OUTPUT FILE
;
PUTDEC:	IDIVI	↑D10
	HRLM	1,(P)
	SKIPE
	PUSHJ	P,PUTDEC
	HLRZ	(P)
	ADDI	60
	PUSHJ	P,PUTCHR
	POPJ	P,
;
;	WLDUFD IS SIMILER TO WLDDIR EXCEPT THAT FILES ARE SCANNED FOR
;	ON THE DSK (OR DTA) NOT DIRECT.  THE SET UP IS:
;
;	PNT: XWD ADR RIGHT FILE LIST,ADR LEFT FILE LIST
;
;	RESULTS ARE PUT IN ACS FILE. THROUGH PPN.
;	THE FLAG FILINC MUST BE OFF (0)  THE FIRST TIME WLDUFD IS CALLED.
;
;	CHANNEL TWO IS USED TO LOOKUP UP THE UFD OR DTA DIRECTORY.
;
;	RETURN IS TO CALL+2 IF MORE IS TO COME, OTHERWISE TO FILE+1
;	IF NO MORE IS THERE.
;
WLDUFD:	HLRZ	3,PNT
	CAMN	3,FILEND
	POPJ	P,
	TRNE	F,DSKUFD
	JRST	DSKFIL
	TRNE	F,DTAUFD
	JRST	DTAFIL
	MOVE	1,3
	PUSHJ	P,WLDCHK
	JRST	WILDGO
	TROE	F,FILINC
	ADDI	PNT,5
	MOVE	FILE.,(3)
	HLLZ	EXT.,1(3)
	MOVE	DEV.,2(3)
	MOVE	PPN.,3(3)
	ADD	PNT,[XWD 5,0]
	JRST	CPOPJ1
WILDGO:	TROE	F,FILINC
	ADDI	PNT,5
	MOVE	2(3)
	MOVE	1,2(3)
	MOVEM	1,OPUFD+1
	DEVCHR
	JUMPE	NODEV+1
	TLNE	DV.DTA
	JRST	DTADIR
	TLNN	DV.DSK
	JRST	BADEV+1
	MOVE	FILE.,3(3)
	MOVSI	EXT.,'UFD'
	MOVE	DEV.,1
	MOVE	PPN.,[XWD 1,1]
	MOVEI	10
	MOVEM	OPUFD
	MOVEI	UFDBUF
	MOVEM	OPUFD+2
	OPEN	2,OPUFD
	JRST	NOTAVL+1
	TRO	F,DSKUFD
	LOOKUP	2,FILE.
	JRST	NOUFD
	IN	2,
	JRST	DSKFIL
	TRO	F,UFDERR
	JRST	UFDIN+2
DSKFIL:	PUSHJ	P,GETUFD
	MOVEM	FILE.
	PUSHJ	P,GETUFD
	HLLZM	EXT.
	JRST	WLDMAT
DTADIR:	MOVEI	17
	MOVEM	OPUFD
	SETZM	OPUFD+2
	OPEN	2,OPUFD
	JRST	NOTAVL+1
	USETI	2,↑D100
	IN	2,DTAWRD
	JRST	DTAGO
	OUTSTR	[ASCIZ/?READ ERROR /]
	GETSTS	2,
	PUSHJ	P,OCTPNT
	OUTSTR	[ASCIZ/ ON DEVICE /]
	PUSHJ	P,SIXPNT
	OUTSTR	CRLF
	JRST	UFDONE
DTAGO:	RELEAS	2,
	SETZM	DTANAM
	TRO	F,DTAUFD
DTAFIL:	AOS	1,DTANAM
	CAIN	1,↑D23
	JRST	UFDONE
	MOVE	FILE.,DTANAM+↑D81(1)
	HLLZ	EXT.,DTANAM+↑D103(1)
WLDMAT:	MOVE	(3)
	CAMN	STAR
	JRST	WLDEXC
	MOVE	FILE.
	AND	4(3)
	CAME	(3)
	JRST	WLDUFD+3
WLDEXC:	HLLZ	2,1(3)
	CAMN	2,STAR
	JRST	WILDOK
	HRLO	1,1(3)
	MOVE	EXT.
	AND	1
	CAME	2
	JRST	.+4
WILDOK:	MOVE	DEV.,2(3)
	MOVE	PPN.,3(3)
	JRST	CPOPJ1
	TLNN	F,L
	JRST	WLDUFD+3
	CAMN	EXT.,[SIXBIT/XCN/]
	JUMPE	2,WILDOK
	JRST	WLDUFD+3
GETUFD:	SOSGE	UFDBUF+2
	JRST	MORUFD
	ILDB	UFDBUF+1
	JUMPE	GETUFD
	POPJ	P,
MORUFD:	PUSHJ	P,UFDIN
	JRST	GETUFD
UFDIN:	IN	2,
	POPJ	P,
	STATZ	2,20000
	JRST	UFDONE
	OUTSTR	[ASCIZ/?ERROR /]
	GETSTS	2,
	PUSHJ	P,OCTPNT
	OUTSTR	[ASCIZ/ WHILE READING [/]
	HLRZ	3(3)
	PUSHJ	P,OCTPNT
	OUTCHR	[","]
	HRRZ	3(3)
	PUSHJ	P,OCTPNT
	OUTSTR	[ASCIZ/].UFD
/]
UFDONE:	RELEAS	2,
	TRZ	F,DSKUFD
	ADD	PNT,[XWD 5,0]
	TRZE	F,UFDERR!DTAUFD
	JRST	.+3
	POP	P,
	POP	P,
	JRST	WLDUFD
NOUFD:	TRO	F,UFDERR
	OUTSTR	[ASCIZ/?LOOKUP FAILURE ON DIRECTORY /]
	PUSHJ	P,FILPNT
	JRST	UFDONE
;
;	XCNCHK CHECKS THE FILE POINTED TO BY AC1 AND PUTS IN THE
;	XCN EXTENSION IF NECESSARY
;
XCNCHK:	MOVE	2(1)
	MOVEM	OPBLKI+1
	OPEN	OPBLKI
	JRST	NOTAVL
	MOVE	FILE.,(1)
	HLLZ	EXT.,1(1)
	MOVE	PPN.,3(1)
	PUSH	P,PPN.
	LOOKUP	FILE.
	JRST	.+2
	JRST	DEVRES
	JUMPN	EXT.,INFERR
	MOVSI	EXT.,'XCN'
	LOOKUP	FILE.
	JRST	INFERR
	HLLM	EXT.,1(1)
DEVRES:	MOVE	DEV.,OPBLKI+1
	POP	P,PPN.
	JRST	CPOPJ1
;
;	COMIT DUMPS THE NECESSARY HEADER AND TRAILER INFORMATION
;	AS WELL AS THE SUBFILE TO BE DUMPED OUT ON THE OUTPUT FILE.
;	THE FILE NAME USED IS GIVEN IN FILE2. AND EXT2.
;
COMIT:	MOVE	BGNCOD
	PUSHJ	P,PUTWRD
	MOVE	FILE2.
	PUSHJ	P,PUTWRD
	MOVE	EXT2.
	PUSHJ	P,PUTWRD
	TIMER
	HRRM	EXT2.
	MOVSS
	HRR	DATE.
	PUSHJ	P,PUTWRD
	MOVEI	XFER,COMFIN
	PUSHJ	P,GETWRD
	PUSHJ	P,PUTWRD
	JRST	.-2
COMFIN:	MOVE	ENDCOD
	PUSHJ	P,PUTWRD
	MOVE	FILE2.
	PUSHJ	P,PUTWRD
	MOVE	EXT2.
	PUSHJ	P,PUTWRD
	POPJ	P,
;
;	FNDFIL TRIES TO FIND FILE. AND EXT. IN DIRECT
;	RETURNS TO CALL+1 IF FOUND, CALL+2 IF NOT FOUND
;
FNDFIL:	SETZ	1,
	SKIPN	DIRECT(1)
	JRST	CPOPJ1
	HLLZ	EXT2.
	HLLZ	2,DIRECT+1(1)
	CAMN	2
	CAME	FILE2.,DIRECT(1)
	JRST	FNDMOR
	TLNN	F,A
	JRST	CPOPJ
	MOVEI	MARK
	IORM	DIRECT+1(1)
	POPJ	P,
FNDMOR:	ADDI	1,4
	JRST	FNDFIL+1
;
;	NEWFIL TAKES PNT AS DEFINED IN WLDUFD AND FILE. AND EXT.
;	AND PRODUCES A NEW FILE NAME IN FILE2. AND EXT. DEPENDING
;	ON THE LEFT FILE LIST (IF THERE IS ONE; OTHERWISE USE
;	THE FILE NAME IN FILE. AND EXT.
;
NEWFIL:	MOVE	FILE2.,FILE.
	HLLZ	EXT2.,EXT.
	TRNN	F,FILST
	POPJ	P,
	HLRZ	1,PNT
	MOVE	FILE2.,(PNT)
	CAMN	FILE2.,STAR
	JRST	SAMFIL
	MOVE	(1)
	TDZ	4(PNT)
	ADD	FILE2.,
NEWEXT:	HLLZ	EXT2.,1(PNT)
	CAMN	EXT2.,STAR
	JRST	SAMEXT
	HRLO	2,1(PNT)
	HLLZ	1(1)
	TDZ	2
	ADD	EXT2.,
	POPJ	P,
SAMFIL:	MOVE	FILE2.,FILE.
	JRST	NEWEXT
SAMEXT:	MOVE	EXT2.,EXT.
	POPJ	P,
EATMUP:	TRO	F,ANYCHR
	PUSHJ	P,CMDCHR
	JUMPN	EATMUP+1
	POPJ	P,
SAVFIL:	POP	P,1			;GET THE ADR TO JRST BACK TO
	PUSH	P,FILES+1		;SAVE REAL EXTENSION OF EXCON FILE
	PUSH	P,FILES+2		;SAVE REAL DEVICE
	PUSH	P,FILES+3		;AND REAL PPN
	MOVSI	'BAK'			;AND READ FROM .BAK FILE
	MOVEM	FILES+1			;SET FOR INPUT
	MOVSI	'DSK'			;READ .BAK FROM THE DSK
	MOVEM	FILES+2			;LET OUTFIL KNOW ABOUT IT
	MOVE	JOBPPN			;.BAK ON THIS USERS AREA
	MOVEM	FILES+3			;SAVE IT FOR OUTFIL
	JRST	(1)			;RETURN
RSTFIL:	POP	P,1			;GET THE TRANSFER ADR
	POP	P,FILES+3		;RESTORE THE REAL PPN
	POP	P,FILES+2		;RESTORE THE REAL DEVICE
	POP	P,FILES+1		;RESTORE THE REAL EXTENSION
	JRST	(1)			;RETURN
;
;	PNTFIL PRINTS THE FILE IN ACS FILE. THROUGH PPN.
;
PNTFIL:	MOVE	1,DEV.
	PUSHJ	P,SIXPNT
	OUTCHR	[":"]
	MOVE	1,FILE.
	PUSHJ	P,SIXPNT
	HLLZ	1,EXT.
	JUMPE	1,.+3
	OUTCHR	["."]
	PUSHJ	P,SIXPNT
	OUTCHR	["["]
	HLRZ	PPN.
	PUSHJ	P,OCTPNT
	OUTCHR	[","]
	HRRZ	PPN.
	PUSHJ	P,OCTPNT
	OUTCHR	["]"]
	POPJ	P,
SETCCL:	MOVE	CCL
	TLZN	777777
	POPJ	P,
	MOVEM	CCL
	MOVE	1,[XWD 2,CCLBLK]
	TMPCOR	1,
	JRST	DSKCCL
	SETZM	CCLBUF+1(1)
SETPNT:	MOVE	[POINT 7,CCLBUF]
	MOVEM	CCLPNT
	POPJ	P,
DSKCCL:	PUSHJ	P,SIXJBN
	HRRI	FILE.,'XCN'
	MOVSI	EXT.,'TMP'
	SETZB	DEV.,PPN.
	MOVSI	'DSK'
	MOVEM	OPZ+1
	OPEN	OPZ
	JRST	NODSK
	LOOKUP	FILE.
	JRST	NOCCL
	IN	CCLBLK+1
	JRST	DELCCL
	OUTSTR	[ASCII/?XCNCRC CANNOT READ CCL FILE
/]
	RELEAS
	JRST	CCLCHR+2
NOCCL:	RELEAS
	SETZM	CCL
	JRST	RENTER
DELCCL:	RENAME	ZEROS
	JFCL
	RELEAS
	JRST	SETPNT
SIXJBN:	PJOB	EXT.,
	IDIVI	EXT.,12
	MOVSI	PPN.,20(DEV.)
	IDIVI	EXT.,12
	MOVSI	FILE.,202000
	LSH	EXT.,↑D30
	LSH	DEV.,↑D24
	ADD	FILE.,EXT.
	ADD	FILE.,DEV.
	ADD	FILE.,PPN.
	POPJ	P,
TYPSTR:	SKPINC
	JFCL
	OUTCHR	["*"]
	POPJ	P,
NOARRW:	OUTSTR	[ASCIZ/?NO BACK ARROW OR EQUAL SIGN
/]
	JRST	RENTER
MNYFIL:	PUSHJ	P,EATMUP
	OUTSTR	[ASCIZ/?TOO MANY FILES MENTIONED
/]
	JRST	RENTER
NOFUNC:	OUTSTR	[ASCIZ/?YOU DIDN'T TELL ME WHAT TO DO
/]
	JRST	RENTER
NULR:	OUTSTR	[ASCIZ/?NULL FILE SPECS ON RIGHT SIDE OF BACK ARROW OR EQUAL SIGN
/]
	JRST	RENTER
NULL:	OUTSTR	[ASCIZ/?NULL FILE SPECS ON LEFT SIDE OF BACK ARROW OR EQUAL SIGN
/]
	JRST	RENTER
BADLST:	OUTSTR	[ASCIZ/?FILE LISTS ARE OF DIFFERENT LENGTHS
/]
	JRST	RENTER
MNYARW:	PUSHJ	P,EATMUP
	OUTSTR	[ASCIZ/?TOO MANY BACK ARROWS OR EQUAL SIGNS
/]
	JRST	RENTER
ILLCHR:	PUSHJ	P,EATMUP
	OUTSTR	[ASCIZ/?ILLEGAL CHARACTER
/]
	JRST	RENTER
NOWILD:	OUTSTR	[ASCIZ/?WILD CARD FILE NAME ILLEGAL
/]
	JRST	RENTER
LSTSEN:	OUTSTR	[ASCIZ/?FILE LIST FOUND ON LEFT SIDE OF BACK ARROW OR EQUAL SIGN
/]
	JRST	RENTER
BADPPN:	PUSHJ	P,EATMUP
	OUTSTR	[ASCIZ/?BAD PPN
/]
	JRST	RENTER
BADFNC:	OUTSTR	[ASCIZ/?UNDEFINED SWITCH
/]
	JRST	RENTER
BADSWI:	OUTSTR	[ASCIZ/?UNDEFINED SWITCH
/]
	JRST	.+2
DBLSWI:	OUTSTR	[ASCIZ/%SIMULTANOUS FUNCTIONS ILLEGAL
/]
	PUSHJ	P,EATMUP
	JRST	RENTER
NOHELP:	OUTSTR	[ASCIZ/%I'M SORRY, I CAN'T HELP YOU
/]
	JRST	RENTER
	SUBTTL	HISEG DATA	G. Ross Explorations, Inc.
BGNCOD:	101010101010
ENDCOD:	010101010101
STAR:	SIXBIT/*/
DEVWL:	ASCIZ/?SOFTWARE DEVICE WRITE LOCK
/
DEVPAR:	ASCIZ/?DEVICE PARITY ERROR
/
DEVBKT:	ASCIZ/?BLOCK OR BLOCK NUMBER TOO LARGE
/
DEVSEK:	ASCIZ/?DSK SEEK ERROR
/
DEVDAT:	ASCIZ/?DATA MISSED
/
CRLF:	BYTE (7) 15,12
ERRTAB:	XWD	NOFILE,UFDPPN
	XWD	PROTEC,FILMOD
	XWD	EXIST,ILLUUO
	XWD	DATAER,NOSAVE
	XWD	NOCORE,DEVUAV
	XWD	NOTDEV,NO2REG
	XWD	NOROOM,WLERR
	XWD	NOMCOR,PARALC
	XWD	BLKNOF,SUPDIR
	XWD	DELDIR,NOSFD
	XWD	SLEMPT,SFDLVL
	XWD	UFDEFT,LOCSEG
NOFILE:	ASCIZ/: (0) FILE NOT FOUND
/
UFDPPN:	ASCIZ/: (1) NO UFD FOR GIVEN PPN
/
PROTEC:	ASCIZ/: (2) PROTECTION FAILURE
/
DTAFUL:	ASCIZ/: (2) DTA DIRECTORY FULL
/
FILMOD:	ASCIZ/: (3) FILE BEING MODIFIED
/
EXIST:	ASCIZ/: (4) ALREADY EXISTING FILE NAME
/
ILLUUO:	ASCIZ/: (5) ILLEGAL SEQUENCE OF UUO'S
/
DATAER:	ASCIZ/: (6) RIB OR UFD ERROR
/
NOSAVE:	ASCIZ/: (7) NOT A SAVED FILE
/
NOCORE:	ASCIZ/: (10) NOT ENOUGH CORE
/
DEVUAV:	ASCIZ/: (11) DEVICE NOT AVAILABLE
/
NOTDEV:	ASCIZ/: (12) NO SUCH DEVICE
/
NO2REG:	ASCIZ/: (13) NO TWO REGISTER RELOCATION
/
NOROOM:	ASCIZ/: (14) NO ROOM OR QUOTA EXCEEDED 
/
WLERR:	ASCIZ/: (15) DSK WRITE LOCKED
/
NOMCOR:	ASCIZ/: (16) MONITOR HAS NO FREE TABLE SPACE
/
PARALC:	ASCIZ/: (17) PARTIAL DSK SPACE ALLOCATION
/
BLKNOF:	ASCIZ/: (20) BLOCK NOT FREE
/
SUPDIR:	ASCIZ/: (21) CANNOT SUPERSEDE EXISTING DIRECTORY
/
DELDIR:	ASCIZ/: (22) CANNOT DELETE NON-EMPTY UFD
/
NOSFD:	ASCIZ/: (23) SFD NOT FOUND
/
SLEMPT:	ASCIZ/: (24) SEARCH LIST EMPTY
/
SFDLVL:	ASCIZ/: (25) MAXIMUM SFD NESTING LEVEL EXCEEDED
/
UFDEFT:	ASCIZ/: (26) CANNOT FIND WRITE-ENABLED DSK
/
LOCSEG:	ASCIZ/: (27) HISEG NOT DORMANT
/
MONTHS:	MONGEN	<Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec>
	LIT
	END	START